// SPDX-License-Identifier: GPL-2.0
/*
 * Device Tree for the ST-Ericsson U300 Machine and SoC
 */

/dts-v1/;
/include/ "skeleton.dtsi"

/ {
	model = "ST-Ericsson U300";
	compatible = "stericsson,u300";
	#address-cells = <1>;
	#size-cells = <1>;

	chosen {
		bootargs = "root=/dev/ram0 console=ttyAMA0,115200n8 earlyprintk";
	};

	aliases {
		serial0 = &uart0;
		serial1 = &uart1;
        };

	memory {
		reg = <0x48000000 0x03c00000>;
	};

	s365 {
		compatible = "stericsson,s365";
		vana15-supply = <&ab3100_ldo_d_reg>;
		syscon = <&syscon>;
	};

	syscon: syscon@c0011000 {
		compatible = "stericsson,u300-syscon", "syscon";
		reg = <0xc0011000 0x1000>;
		clk32: app_32_clk@32k {
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <32768>;
		};
		pll13: pll13@13M {
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <13000000>;
		};
		/* Slow bridge clocks under PLL13 */
		slow_clk: slow_clk@13M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <0>; /* Slow */
			clock-id = <0>;
			clocks = <&pll13>;
		};
		uart0_clk: uart0_clk@13M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <0>; /* Slow */
			clock-id = <1>;
			clocks = <&slow_clk>;
		};
		gpio_clk: gpio_clk@13M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <0>; /* Slow */
			clock-id = <4>;
			clocks = <&slow_clk>;
		};
		rtc_clk: rtc_clk@13M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <0>; /* Slow */
			clock-id = <6>;
			clocks = <&slow_clk>;
		};
		apptimer_clk: app_tmr_clk@13M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <0>; /* Slow */
			clock-id = <7>;
			clocks = <&slow_clk>;
		};
		acc_tmr_clk@13M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <0>; /* Slow */
			clock-id = <8>;
			clocks = <&slow_clk>;
		};
		pll208: pll208@208M {
			#clock-cells = <0>;
			compatible = "fixed-clock";
			clock-frequency = <208000000>;
		};
		app208: app_208_clk@208M {
			#clock-cells = <0>;
			compatible = "fixed-factor-clock";
			clock-div = <1>;
			clock-mult = <1>;
			clocks = <&pll208>;
		};
		cpu_clk@208M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <3>;
			clocks = <&app208>;
		};
		app104: app_104_clk@104M {
			#clock-cells = <0>;
			compatible = "fixed-factor-clock";
			clock-div = <2>;
			clock-mult = <1>;
			clocks = <&pll208>;
		};
		semi_clk@104M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <9>;
			clocks = <&app104>;
		};
		app52: app_52_clk@52M {
			#clock-cells = <0>;
			compatible = "fixed-factor-clock";
			clock-div = <4>;
			clock-mult = <1>;
			clocks = <&pll208>;
		};
		/* AHB subsystem clocks */
		ahb_clk: ahb_subsys_clk@52M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <10>;
			clocks = <&app52>;
		};
		intcon_clk@52M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <12>;
			clocks = <&ahb_clk>;
		};
		emif_clk@52M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <5>;
			clocks = <&ahb_clk>;
		};
		dmac_clk: dmac_clk@52M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <4>;
			clocks = <&app52>;
		};
		fsmc_clk: fsmc_clk@52M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <6>;
			clocks = <&app52>;
		};
		xgam_clk: xgam_clk@52M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <2>; /* Rest */
			clock-id = <8>;
			clocks = <&app52>;
		};
		app26: app_26_clk@26M {
			#clock-cells = <0>;
			compatible = "fixed-factor-clock";
			clock-div = <2>;
			clock-mult = <1>;
			clocks = <&app52>;
		};
		/* Fast bridge  clocks */
		fast_clk: fast_clk@26M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <1>; /* Fast */
			clock-id = <0>;
			clocks = <&app26>;
		};
		i2c0_clk: i2c0_clk@26M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <1>; /* Fast */
			clock-id = <1>;
			clocks = <&fast_clk>;
		};
		i2c1_clk: i2c1_clk@26M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <1>; /* Fast */
			clock-id = <2>;
			clocks = <&fast_clk>;
		};
		mmc_pclk: mmc_p_clk@26M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <1>; /* Fast */
			clock-id = <5>;
			clocks = <&fast_clk>;
		};
		mmc_mclk: mmc_mclk {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-mclk";
			clocks = <&mmc_pclk>;
		};
		spi_clk: spi_p_clk@26M {
			#clock-cells = <0>;
			compatible = "stericsson,u300-syscon-clk";
			clock-type = <1>; /* Fast */
			clock-id = <6>;
			clocks = <&fast_clk>;
		};
	};

	timer: timer@c0014000 {
		compatible = "stericsson,u300-apptimer";
		reg = <0xc0014000 0x1000>;
		interrupt-parent = <&vica>;
		interrupts = <24 25 26 27>;
		clocks = <&apptimer_clk>;
	};

	gpio: gpio@c0016000 {
		compatible = "stericsson,gpio-coh901";
		reg = <0xc0016000 0x1000>;
		interrupt-parent = <&vicb>;
		interrupts = <0 1 2 18 21 22 23>;
		clocks = <&gpio_clk>;
		interrupt-names = "gpio0", "gpio1", "gpio2", "gpio3",
				"gpio4", "gpio5", "gpio6";
		interrupt-controller;
		#interrupt-cells = <2>;
		gpio-controller;
		#gpio-cells = <2>;
	};

	pinctrl: pinctrl@c0011000 {
		compatible = "stericsson,pinctrl-u300";
		reg = <0xc0011000 0x1000>;
	};

	watchdog: watchdog@c0012000 {
		compatible = "stericsson,coh901327";
		reg = <0xc0012000 0x1000>;
		interrupt-parent = <&vicb>;
		interrupts = <3>;
		clocks = <&clk32>;
	};

	rtc: rtc@c0017000 {
		compatible = "stericsson,coh901331";
		reg = <0xc0017000 0x1000>;
		interrupt-parent = <&vicb>;
		interrupts = <10>;
		clocks = <&rtc_clk>;
	};

	dmac: dma-controller@c00020000 {
		compatible = "stericsson,coh901318";
		reg = <0xc0020000 0x1000>;
		interrupt-parent = <&vica>;
		interrupts = <2>;
		#dma-cells = <1>;
		dma-channels = <40>;
		clocks = <&dmac_clk>;
	};

	/* A NAND flash of 128 MiB */
	fsmc: flash@40000000 {
		compatible = "stericsson,fsmc-nand";
		#address-cells = <1>;
		#size-cells = <1>;
		reg = <0x9f800000 0x1000>,	/* FSMC Register*/
			<0x80000000 0x4000>,	/* NAND Base DATA */
			<0x80020000 0x4000>,	/* NAND Base ADDR */
			<0x80010000 0x4000>;	/* NAND Base CMD */
		reg-names = "fsmc_regs", "nand_data", "nand_addr", "nand_cmd";
		nand-skip-bbtscan;
		clocks = <&fsmc_clk>;

		partition@0 {
		label = "boot records";
			reg = <0x0 0x20000>;
		};
		partition@20000 {
			label = "free";
			reg = <0x20000 0x7e0000>;
		};
		partition@800000 {
			label = "platform";
			reg = <0x800000 0xf800000>;
		};
	};

	i2c0: i2c@c0004000 {
		compatible = "st,ddci2c";
		reg = <0xc0004000 0x1000>;
		interrupt-parent = <&vicb>;
		interrupts = <8>;
		clocks = <&i2c0_clk>;
		#address-cells = <1>;
		#size-cells = <0>;
		ab3100: ab3100@48 {
			compatible = "stericsson,ab3100";
			reg = <0x48>;
			interrupt-parent = <&vica>;
			interrupts = <0>; /* EXT0 IRQ */
			ab3100-regulators {
				compatible = "stericsson,ab3100-regulators";
				ab3100_ldo_a_reg: ab3100_ldo_a {
					startup-delay-us = <200>;
					regulator-always-on;
					regulator-boot-on;
				};
				ab3100_ldo_c_reg: ab3100_ldo_c {
					startup-delay-us = <200>;
				};
				ab3100_ldo_d_reg: ab3100_ldo_d {
					startup-delay-us = <200>;
				};
				ab3100_ldo_e_reg: ab3100_ldo_e {
					regulator-min-microvolt = <1800000>;
					regulator-max-microvolt = <1800000>;
					startup-delay-us = <200>;
					regulator-always-on;
					regulator-boot-on;
				};
				ab3100_ldo_f_reg: ab3100_ldo_f {
					regulator-min-microvolt = <2500000>;
					regulator-max-microvolt = <2500000>;
					startup-delay-us = <600>;
					regulator-always-on;
					regulator-boot-on;
				};
				ab3100_ldo_g_reg: ab3100_ldo_g {
					regulator-min-microvolt = <1500000>;
					regulator-max-microvolt = <2850000>;
					startup-delay-us = <400>;
				};
				ab3100_ldo_h_reg: ab3100_ldo_h {
					regulator-min-microvolt = <1200000>;
					regulator-max-microvolt = <2750000>;
					startup-delay-us = <200>;
				};
				ab3100_ldo_k_reg: ab3100_ldo_k {
					regulator-min-microvolt = <1800000>;
					regulator-max-microvolt = <2750000>;
					startup-delay-us = <200>;
				};
				ab3100_ext_reg: ab3100_ext {
				};
				ab3100_buck_reg: ab3100_buck {
					regulator-min-microvolt = <1200000>;
					regulator-max-microvolt = <1800000>;
					startup-delay-us = <1000>;
					regulator-always-on;
					regulator-boot-on;
				};
			};
		};
	};

	i2c1: i2c@c0005000 {
		compatible = "st,ddci2c";
		reg = <0xc0005000 0x1000>;
		interrupt-parent = <&vicb>;
		interrupts = <9>;
		clocks = <&i2c1_clk>;
		#address-cells = <1>;
		#size-cells = <0>;
		fwcam0: fwcam@10 {
			reg = <0x10>;
		};
		fwcam1: fwcam@5d {
			reg = <0x5d>;
		};
	};

	amba {
		compatible = "simple-bus";
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;

		vica: interrupt-controller@a0001000 {
			compatible = "arm,versatile-vic";
			interrupt-controller;
			#interrupt-cells = <1>;
			reg = <0xa0001000 0x20>;
		};

		vicb: interrupt-controller@a0002000 {
			compatible = "arm,versatile-vic";
			interrupt-controller;
			#interrupt-cells = <1>;
			reg = <0xa0002000 0x20>;
		};

		uart0: serial@c0013000 {
			compatible = "arm,pl011", "arm,primecell";
			reg = <0xc0013000 0x1000>;
			interrupt-parent = <&vica>;
			interrupts = <22>;
			clocks = <&uart0_clk>, <&uart0_clk>;
			clock-names = "apb_pclk", "uart0_clk";
			dmas = <&dmac 17 &dmac 18>;
			dma-names = "tx", "rx";
		};

		uart1: serial@c0007000 {
			compatible = "arm,pl011", "arm,primecell";
			reg = <0xc0007000 0x1000>;
			interrupt-parent = <&vicb>;
			interrupts = <20>;
			dmas = <&dmac 38 &dmac 39>;
			dma-names = "tx", "rx";
		};

		mmcsd: mmcsd@c0001000 {
			compatible = "arm,pl18x", "arm,primecell";
			reg = <0xc0001000 0x1000>;
			interrupt-parent = <&vicb>;
			interrupts = <6 7>;
			clocks = <&mmc_pclk>, <&mmc_mclk>;
			clock-names = "apb_pclk", "mclk";
			max-frequency = <24000000>;
			bus-width = <4>; // SD-card slot
			cap-mmc-highspeed;
			cap-sd-highspeed;
			cd-gpios = <&gpio 12 0x4>;
			cd-inverted;
			vmmc-supply = <&ab3100_ldo_g_reg>;
			dmas = <&dmac 14>;
			dma-names = "rx";
		};

		spi: spi@c0006000 {
			compatible = "arm,pl022", "arm,primecell";
			reg = <0xc0006000 0x1000>;
			interrupt-parent = <&vica>;
			interrupts = <23>;
			clocks = <&spi_clk>, <&spi_clk>;
			clock-names = "SSPCLK", "apb_pclk";
			dmas = <&dmac 27 &dmac 28>;
			dma-names = "tx", "rx";
			num-cs = <3>;
			#address-cells = <1>;
			#size-cells = <0>;
			spi-dummy@1 {
				compatible = "arm,pl022-dummy";
				reg = <1>;
				spi-max-frequency = <20000000>;
			};
		};
	};
};
